package com.yu.dao;

import org.apache.commons.dbcp2.BasicDataSource;

import javax.sql.DataSource;

/**
 * 数据源一般是单例模式
 */
public class DBCPDataSource {
    // 1 单例模式类的静态实例变量
    private static DataSource dataSource;// = new BasicDataSource();  // 饿汉方式 -- 线程安全的

    // 静态语句块进行初始
    static { // 线程安全的，和饿汉方式是一样，只不过形式不一样
        BasicDataSource basicDataSource = new BasicDataSource();
        // 设置数据源的数据库连接属性
        // 数据库jdbc连接属性信息
        // uri mysql5和mysql8 连接串不一样，8要求有时区属性
        // localhost - 数据库服务器主机名，或者ip地址， 127.0.0.1 表示本机
        // 注意： 如果连接串解析是被，要注意可能是因为 & 引起的，因为有时需要 使用 & 的html转移符号  &amp;
        String strUri5 = "jdbc:mysql://localhost:3306/nuc202105?useUnicode=true&characterEncoding=utf8";
        String strUri8 = "jdbc:mysql://localhost:3306/nuc202105?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=Hongkong&allowPublicKeyRetrieval=true";
        // drivername的名字 mysql5和mysql8 不一样
        String strDriverName5 = "com.mysql.jdbc.Driver";
        String strDriverName8 = "com.mysql.cj.jdbc.Driver";

        String strUserName = "root";
        String strUserPsw = "8518.zq";

        // 给数据源对象设置相关数据库连接属性
        basicDataSource.setUrl(strUri8);
        basicDataSource.setDriverClassName(strDriverName8);
        basicDataSource.setUsername(strUserName);
        basicDataSource.setPassword(strUserPsw);
        // 还可以继续set设置dbcp数据源的其他的属性值【参考官网或其他资料设置，一般根据项目运行时的状态由dba进行调试，此处，采用默认值】
        basicDataSource.setInitialSize(3); // 连接池初始化的数量
        // 多态，父类指代子类
        dataSource = basicDataSource;
    }

    // 2 构造方法私有化
    private DBCPDataSource() {
    }

    // 3 提供一个全局的访问方法入口
    public static DataSource getDataSource() {
        return dataSource;
    }
}
